#include <tipos.h>
#include <syscalls.h>
#include <fs.h>
#include <errors.h>
#include <string.h>
#include <stdio.h>

#define BUFFER_LEN 4096

void encrypt(char *buffer, int size) {
	
	int i;
	
	for (i = 0; i < size; i++) {
		buffer[i] = toUpper(buffer[i]);
	}
}

void encrypt2(char *buffer, int size) {
	
	char key[] = "pepe";
	int key_len, i;
	
	key_len = strlen(key);
	
	for (i = 0; i < size; i++) {
		buffer[i] ^= key[i % key_len];
	}
}

int main(void) {
 
	int leidos;
	
	char * buffer = (char *) palloc();

	FILE_DESC pipe_to_enc[2];
	FILE_DESC pipe_from_enc[2];
	
	stdio_init();

	//Pido los pipes
	pipe(pipe_to_enc);
	pipe(pipe_from_enc);

	stdio_print("krypto 1.0\n");
	
	if( fork() )
	{
		if( fork() )
		{
			stdio_printf("krypto reader (%d)\n", getpid() );
			
			flush(pipe_to_enc[0]);
			flush(pipe_from_enc[0]);
			flush(pipe_from_enc[1]);
			
			FILE_DESC file;
			file = open("/disk/eva.txt", FS_OPEN_RDWR);
			
			if (file == -ENOCHARDEV) {
				stdio_print("Error: No se pudo abrir el archivo\n");
			}
			else {
				while (1) {
					
					leidos = read(file, buffer, BUFFER_LEN);
					
					if (leidos == 0)
						break;
										
					write(pipe_to_enc[1], buffer, leidos);
				}
			}
			
			flush(pipe_to_enc[1]);
			
			stdio_printf("krypto reader done\n");
			
		}
		else
		{
			stdio_printf("krypto encrypt (%d)\n", getpid() );
			
			flush(pipe_to_enc[1]);
			flush(pipe_from_enc[0]);
			
			while (1) {
				 
				leidos = read(pipe_to_enc[0], buffer, BUFFER_LEN);
				
			
				if (leidos == 0) break;
				
				encrypt(buffer,leidos);
				
				write(pipe_from_enc[1], buffer, leidos);
				
			}
						
			flush(pipe_from_enc[1]);
			
			stdio_printf("krypto encrypt done\n");
			
		}
	}
	else
	{
		
		stdio_printf("krypto write (%d)\n", getpid() );
		
		flush(pipe_to_enc[0]);
		flush(pipe_to_enc[1]);
		flush(pipe_from_enc[1]);
		
		FILE_DESC file;
		file = open("/serial0", FS_OPEN_RDWR);
		
		while (1) {
			
			leidos = read(pipe_from_enc[0], buffer, BUFFER_LEN);
			
			if (leidos == 0)	break;
						
			write(file, buffer, leidos);
			
		}
				
		stdio_printf("krypto write done\n");
		flush(file);
		flush(pipe_from_enc[0]);
		
		stdio_print("Listo! - Presione una tecla para finalizar\n");
		stdio_wait();

	}
	
	stdio_close();

	exit();

	return 0;
}
